iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 17
1
Security

我搶到旗子了!30天CTF入門系列 第 17

Day17[Reverse] 電腦不夠快怎麼辦(3)

  • 分享至 

  • xImage
  •  

Day06 general skill 的三星題目已經更新上去了,有興趣的可以去看看~


又是一題電腦太慢的問題,直接用ghidra打開吧

整個程式的架構跟前兩題沒什麼不同,一樣是三秒會觸發alarm,唯一不同的是calculate_key當中所呼叫的函式不一樣

提示也說我們要如何加速這種一直做重複動作的運算呢

這邊運用Dynamic Programming的概念,這邊寫了一個C的程式來運行這段程式碼

#include <stdio.h>
#define SIZE 0x18e28
unsigned int result[SIZE];
int check[SIZE];

unsigned int cal(unsigned int x){ 
    unsigned int var1,var2,var3,var4,var5,num;
    if(check[x])
        return result[x];
    if(x<5) 
        num=x*x+0x2345;
    else{
        var1 = cal(x-1);
        var2 = cal(x-2);
        var3 = cal(x-3);
        var4 = cal(x-4);
        var5 = cal(x-5);
        num = var5*0x1234 + (var1-var2) + (var3-var4);  
    }   
    check[x] = 1;
    result[x]=num;
    return num;
}
int main(){
    printf("%u",cal(SIZE));
}

可以得出結果為 4180374238

接著在使用上次的方法將前面的呼叫函式透過hexeditor轉成nop,在print_flag之前更改暫存器的值

更改完後再透過gdb查看,有成功更改成nop就可以繼續了
接著看看print_flag的組合語言碼

在print_flag+20的地方將eax的值改成我們剛剛計算出來的結果


其實有時候解ctf的題目也是考驗寫程式的能力,看到這flag的確是利用Dynamic programming的方式來解這題,不過這題也算是蠻容易的題目,畢竟picoCTF本來就算是入門的CTF


上一篇
Day16[Reverse] 組合語言--暫存器運用
下一篇
Day18[Reverse] 魔鬼藏在細節裡
系列文
我搶到旗子了!30天CTF入門30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言